public class code2 {
//    力扣 150 有效的数独
    // 第一次写二维数组题目

    public boolean isValidSudoku(char[][] board) {
        // 整体的验证思路是，从小到大，从边界到内部

        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[0].length; j++) {
                if(board[i][j] >= '0' && board[i][j] <= '9') {
                    // 这里实现一个方法，进行分类讨论判断
                    if(!getOther(i, j, board)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public boolean getOther(int i, int j, char[][] board) {
        // 验证当前 i 这一行
        for(int n = 0; n < board[i].length; n++) {
            // 数字不能重复出现
            // 这里后面的判断条件的作用是防止出现对同一个位置上的元素重复判断
            if(board[i][n] == board[i][j] && n != j) {
                return false;
            }
        }

        // 验证当前 j 这一列
        for(int m = 0; m < board.length; m++) {
            if(board[m][j] == board[i][j] && m != i) {
                return false;
            }
        }

        // 验证 3X3 范围内的小格数组
        int sl = (i / 3) *3;
        int sh = (j / 3) *3;
        for(int k1 = sl; k1 < sl + 3; k1++) {
            for(int k2 = sh; k2 < sh + 3; k2++) {
                // 同样的，这里后面的判断条件的作用就是排除将同一个位置上的值进行了重复判断
                if(board[k1][k2] == board[i][j] && (k1 != i && k2 != j)) {
                    return false;
                }
            }
        }
        return true;
    }
}
